# 在括号内指定多个父类名称就是多继承
class ShenXian:
    def fly(self):
        print('神仙都会飞')
        pass
    pass
class Monkey:
    def chitao(self):
        print('猴子喜欢吃桃')
        pass
    pass
class SunWuKong(ShenXian,Monkey):#既是神仙也是猴子
    pass
swk=SunWuKong()
swk.chitao()
swk.fly()
# 问题是当多个父类当中存在同名属性或方法的时候，会去调用哪一个呢
# 多继承中，如果父类有同名的属性或方法，那么默认以继承顺序(从左到右)为优先级，先继承的优先级高于后继承
# 子类中定义与父类同名的属性或方法就实现了复写
# 如果需要使用被复写的父类的成员，需要特殊的调用方式：
# 方式1：父类名+.的语法调用父类的成员(这种方式调用的实例方法是一个未绑定到实例的方法，需要手动传入self。若子类覆盖了父类的属性或方法则需要创建独立的父类实例，并传入父类的实例对象才能使用)
# 方式2：super()+.的语法调用父类的成员(这种方式在调用的实例方法内不需要传self)
class D(object):
    def eat(self):
        print('D.eat')
        pass
    pass
class C(D):
    def eat(self):
        print('C.eat')
        pass
    pass
class B(D):
    pass
class A(B,C):
    pass
a=A()
a.eat()#在执行eat方法时，查找方法的顺序应该是
print(A.__mro__)#可以显示类的依次继承关系，从左往右
# 首先到A类里面去查找，如果A类中没有，则继续去B类中查找，如果B类中没有，则去C类中查找，如果C类中没有则去D类中查找，再没有就会报错
# __mro__方法解析顺序
# 功能：查询执行顺序
# 方法的执行顺序可以用mro查看。一旦找到，则寻找过程立即中断，便不会再继续找了
# 间接继承
class GrandFather:
    def eat(self):
        print('吃的方法')
        pass
    pass
class Father(GrandFather):
    pass
class Son(Father):
    # def eat(self):#方法重写
    #     print('爸爸经常吃海鲜')
    pass
son=Son()
print(Son.__mro__)
son.eat()#此方法由GrandFather继承
# 方法重写
# 所谓重写就是子类中，有一个和父类相同名字的方法，在子类中的方法会覆盖掉父类中同名的方法。
# 父类的方法已经不满足子类的需要，那么子类就可以重写父类或者完善父类的方法。
class Dog:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        pass
    def bark(self):
        print('汪汪叫')
        pass
    pass
class kejiquan(Dog):
    def __init__(self,name,color):#重写父类的初始化方法
        Dog.__init__(self,name,color)#使用父类名+.语法，手动调用父类的方法，执行完毕就可以具备name，color父类已有的两个实例属性
        # super().__init__(name,color)#super是自动找到父类进而调用方法，假设继承了多个父类，那么会按顺序逐个去找，然后再调用(它的核心作用是通过方法解析顺序（MRO）动态确定应该调用的父类方法，无参数自动推断当前类和实例，也可以手动指定类和实例)
        # super(type, object_or_type)
        # type 参数：告诉super()从继承链的哪个类开始向后查找父类方法，object_or_type参数：提供具体的实例或类，用于获取该对象的MRO列表。
        #可以拓展其他的属性
        self.height=90
        self.weight=20
        pass
    def __str__(self):
        return '{}的颜色是{} 它的身高是{}cm体重是{}'.format(self.name,self.color,self.height,self.weight)
    def bark(self):#重写父类的实例方法
        super().bark()#自动调用父类方法可以在此基础上拓展子类的某些功能
        print('叫的跟神一样')
        print(self.name)
        pass
    pass
kj=kejiquan('柯基犬','红色')
kj.bark()
print(kj)